﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 复合行为 - 组合多个行为并加权计算最终移动向量
/// 允许将多个群体行为组合使用，通过权重控制各行为的影响程度
/// 可在编辑器中创建：Create > Flock > Behavior > Composite
/// </summary>
[CreateAssetMenu(menuName = "Flock/Behavior/Composite")]
public class CompositeBehavior : FlockBehavior
{
    [Header("行为组合")]
    [SerializeField]
    [Tooltip("要组合的行为数组")]
    public FlockBehavior[] behaviors = new FlockBehavior[0];
    
    [Tooltip("对应行为的权重数组，控制各行为的影响程度")]
    public float[] weights;

    /// <summary>
    /// 计算复合行为的移动向量
    /// 组合所有子行为的移动向量，根据权重进行加权计算
    /// </summary>
    /// <param name="agent">当前个体</param>
    /// <param name="context">邻居对象列表</param>
    /// <param name="flock">所属群体</param>
    /// <returns>复合行为的移动向量</returns>
    public override Vector2 CalculateMove(FlockAgent agent, List<Transform> context, Flock flock)
    {
        // 检查数组长度是否匹配
        if (weights.Length != behaviors.Length)
        {
            Debug.LogError("Data mismatch in " + name, this);
            return Vector2.zero;
        }

        // 初始化最终移动向量
        Vector2 move = Vector2.zero;

        // 遍历所有行为并计算加权移动向量
        for (int i = 0; i < behaviors.Length; i++)
        {
            // 计算当前行为的移动向量并应用权重
            Vector2 partialMove = behaviors[i].CalculateMove(agent, context, flock) * weights[i];

            if (partialMove != Vector2.zero)
            {
                // 如果部分移动向量超过权重限制，进行标准化
                if (partialMove.sqrMagnitude > weights[i] * weights[i])
                {
                    partialMove.Normalize();
                    partialMove *= weights[i];
                }

                // 累加到最终移动向量
                move += partialMove;
            }
        }

        return move;
    }
}
